home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-07-28 | 11.3 KB | 587 lines | [TEXT/MPS ] |
- /*
- File: Application.cp
-
- Contains: CORE for test gadgets
-
- Written by: Tim Harnett
-
- Copyright: © 1994 by Apple Computer, Inc., all rights reserved.
-
- Change History (most recent first):
-
- 9/29/94 TMH xxx put comment here xxx
-
- To Do:
- */
-
-
-
- #ifndef __RESOURCES__
- #include "Resources.h"
- #endif
-
- #ifndef __Debug__
- #include "Debug.h"
- #endif
-
- #ifndef __UFAILURE__
- #include "UFailure.h"
- #endif
-
- #ifndef __OCEERRORS__
- #include "OCEErrors.h"
- #endif
-
- #ifndef __BaseTypes__
- #include "BaseTypes.h"
- #endif
-
- #ifndef __CRString__
- #include "CRString.h"
- #endif
-
- #ifndef __CRecordID__
- #include "CRecordID.h"
- #endif
-
- #ifndef __FileUtils__
- #include "FileUtils.h"
- #endif
-
- #ifndef __CAttribute__
- #include "CAttribute.h"
- #endif
-
- #ifndef __SwapPMSAM__
- #include "SwapPMSAM.h"
- #endif
-
-
-
- TApplication* gApplication = 0;
- Boolean gDone = false;
- AuthIdentity gIdentity = 0;
- short gKeyChainDSRefnum = 0;
-
-
- //•••••••••••••
-
- //------------------------------------
- // C R e c o r d E n u m e r a t o r
- //-----------------------------------
-
-
- CRecordType gWildCardRecordType("="); // use in enumeration to mean all record types
- CRecordName gWildCardRecordName("="); // use in enumeration to mean all record names.
-
-
- // A very simple record enumerator. That we use to find records.
-
- const long pEnumerateRecordChunkSize = 512;
-
- class CRecordEnumerator {
- public:
-
- CRecordEnumerator(CRecordID& matchRecord);
- OSErr Enumerate();
-
-
- private:
-
-
- static pascal Boolean __EachRecordCallBack( long clientData, const DirEnumSpec *enumSpec );
- virtual Boolean EachRecordCallBack(CreationID* cid, RString* recName,RString* recType) = 0;
-
- void Get();
- void Parse();
-
- DirEnumSpec* GetStartingPoint() { return 0; }
-
- private:
-
- CRecordName fMatchName;
- CRecordType fMatchType;
- CPackedRLI fWhereRLI;
-
- CRecordID* fMatchRecord;
-
- DirParamBlock fDSParamBlock;
- DirEnumerateGetPB *fGetPB; // convenience
- DirEnumerateParsePB *fParsePB;
-
- OSErr fOSErr;
- OSErr fParseErr;
-
- char* fGetBuffer[pEnumerateRecordChunkSize]; // we assume a good sized stack.
-
- };
-
-
- //-------------------------------------------------------------------
- CRecordEnumerator::CRecordEnumerator(CRecordID& match)
- {
- fOSErr = 0;
- fParseErr = 0;
-
- memset(&fDSParamBlock,0,sizeof(DirParamBlock));
- fGetPB = (DirEnumerateGetPB*) &fDSParamBlock;
- fParsePB = (DirEnumerateParsePB*) &fDSParamBlock;
-
-
- fMatchName = *match.fName; // copy
- fMatchType = *match.fType; // copy
- fWhereRLI = *match.fRLI; // copy
-
- fGetPB->aRLI = fWhereRLI;
-
-
- fDSParamBlock.header.dsRefNum = fWhereRLI.GetDSRefNum();
- fDSParamBlock.header.identity = gIdentity;
-
-
-
- fGetPB->clientData = (long)this;
-
- fGetPB->getBuffer = (Ptr) fGetBuffer;
- fGetPB->getBufferSize = pEnumerateRecordChunkSize;
- }
-
- //--------------------------------------------------------------------
- OSErr CRecordEnumerator::Enumerate()
- {
-
- // Loop till we get all the records
- do {
-
- this->Get();
-
- if( fOSErr != 0 && fOSErr != kOCEMoreData)
- break;
-
- this->Parse();
-
- if( fOSErr != 0 && ( fOSErr != kOCEMoreData && fOSErr != kOCENoSuchDNode) )
- break;
-
- } while ( fOSErr == kOCEMoreData );
-
-
- return fOSErr;
- }
-
- //---------------------------------------------------------------------------------------------
- void CRecordEnumerator::Parse()
- {
-
- fParsePB->eachEnumSpec = CRecordEnumerator::__EachRecordCallBack;
-
- fOSErr = DirEnumerateParse((DirParamBlock*)fParsePB, false);
- if( fOSErr == 0 && fParseErr != 0 )
- fOSErr = fParseErr;
-
- }
-
-
-
-
- //---------------------------------------------------------------------------------------------
- void CRecordEnumerator::Get()
- {
- fGetPB->startingPoint = this->GetStartingPoint(); // in case we continue.
- fGetPB->sortBy = kSortByName;
- fGetPB->sortDirection = kSortForwards;
-
- fGetPB->nameMatchString = fMatchName;
-
-
- RString* recTypePtr = fMatchType;
- fGetPB->typesList = &recTypePtr;
- fGetPB->typeCount = 1;
-
-
- fGetPB->includeStartingPoint = ( fGetPB->startingPoint != 0 );
-
- if( fMatchName == gWildCardRecordName )
- fGetPB->matchNameHow = kMatchAll;
- else
- fGetPB->matchNameHow = kExactMatch;
-
-
- if( (CRecordType&)**fGetPB->typesList == gWildCardRecordType )
- fGetPB->matchTypeHow = kMatchAll;
- else
- fGetPB->matchTypeHow = kExactMatch;
-
-
- fGetPB->enumFlags = kEnumDistinguishedNameMask;
-
- fOSErr = DirEnumerateGet((DirParamBlock*)fGetPB, false);
-
-
- }
-
-
- //---------------------------------------------------------------------------------------------
- pascal Boolean CRecordEnumerator::__EachRecordCallBack(long clientData,const DirEnumSpec* enumSpec)
- {
- Boolean haltEnumeration = false;
-
- CRecordEnumerator* thisEnumerator = (CRecordEnumerator*) clientData;
-
- haltEnumeration = thisEnumerator->EachRecordCallBack(&enumSpec->u.recordIdentifier.cid, enumSpec->u.recordIdentifier.recordName,enumSpec->u.recordIdentifier.recordType);
-
- return haltEnumeration;
-
- }
-
-
-
- //-----------------------------------
- // C F i n d E n u m e r a t o r
- //----------------------------------
-
-
- class CFindRecordEnumerator : public CRecordEnumerator {
- public:
- CFindRecordEnumerator(CRecordID& findThis);
- virtual Boolean EachRecordCallBack(CreationID* cid, RString* recName,RString* recType);
- CreationID& GetCID() { return fMatchedCID; };
- private:
- CreationID fMatchedCID;
- };
-
-
- //-----------------------------------------------------------------------------
- CFindRecordEnumerator::CFindRecordEnumerator(CRecordID& recordToFind) : CRecordEnumerator(recordToFind)
- {
- fMatchedCID = gZeroCID;
- }
-
- //-----------------------------------------------------------------------------
- Boolean CFindRecordEnumerator::EachRecordCallBack(CreationID* cid, RString* /* recName*/,RString* /*recType*/)
- {
- Boolean haltEnumeration = true;
-
- fMatchedCID.source = cid->source;
- fMatchedCID.seq = cid->seq;
-
- return haltEnumeration;
-
- }
-
-
- //-----------------------------------------------------------------------------
- OSErr FindRecord(CRecordID& recordToFind)
- {
-
- CFindRecordEnumerator enumerator(recordToFind);
- OSErr osErr = enumerator.Enumerate();
-
- CreationID foundCID = enumerator.GetCID();
-
- if( osErr == 0 && foundCID != gZeroCID ) {
- recordToFind.fCID.source = foundCID.source;
- recordToFind.fCID.seq = foundCID.seq;
- return 0;
- } else {
- return kOCENoSuchRecord;
- }
-
-
- }
-
-
- //•••••••••••••
-
-
-
- //--------------------------------------
- // m a i n
- //--------------------------------------
-
-
- //-------------------------------------------------------------------------------------
- void main(void)
- {
-
- // Initialize the Toolbox
-
-
- MaxApplZone();
- MoreMasters();
- MoreMasters();
- InitGraf(&qd.thePort);
-
- FlushEvents(everyEvent, 0);
- FailInfo fi;
- Try(fi) {
-
- gApplication = new TApplication;
- gApplication->IApplication();
-
-
- FlushEvents(everyEvent, 0);
-
- //gApplication->Run();
- fi.Success();
-
- }
-
-
-
-
- }
-
-
-
- //--------------------------------------
- // T A p p l i c a t i o n
- //--------------------------------------
-
- //-------------------------------------------------------------------------------------
- TApplication::TApplication()
- {
-
-
- fWNESleepTime = kSleepTime;
- }
-
-
- //-------------------------------------------------------------------------------------
- void TApplication::IApplication()
- {
-
-
- // Destination (extensions folder)
-
-
- CFolder extensionsFolder(kExtensionFolderType);
-
- Handle eworldFileNameH = GetResource('STR ',128);
- FailResError();
-
-
- Str255 eworldFileName;
- BlockMove(*eworldFileNameH,eworldFileName,**eworldFileNameH+1);
-
- CFile destFile(0,extensionsFolder.DirID(),eworldFileName);
- if( !destFile.Exists() )
- FailOSErr(fnfErr);
-
- // Source Folder (:Objects)
-
-
- CFolder sourceFolder;
- FocHFSHeirarchyFromResource(128,sourceFolder);
-
- CFile srcFile(0,sourceFolder.DirID(),eworldFileName);
- if( !srcFile.Exists() )
- FailOSErr(fnfErr);
-
- // Do It
-
-
- OSErr osErr = ExchangeFileIDs(srcFile,destFile);
-
-
-
-
- #ifdef JUNK
-
- this->InitAuth();
-
-
- // Get AOCE keychain catalog
-
- DirParamBlock dirPB;
- memset(&dirPB,0,sizeof(DirParamBlock));
- OSErr osErr = DirGetOCESetupRefNum(&dirPB,false);
- if (osErr!=noErr) {
- ///••••
- }
-
- gKeyChainDSRefnum = dirPB.dirGetOCESetupRefNumPB.dsRefNum;
-
- CRecordID msamRecord(gKeyChainDSRefnum,"eWorldMSAM","aoce MSAM");
- osErr = FindRecord(msamRecord);
- if( osErr == 0 )
- osErr = msamRecord.Delete();
- ASSERTNOERR(osErr);
-
-
- CRecordID slotRecord(gKeyChainDSRefnum,"eWorld Slot","aoce Mail ServiceEwrd");
- osErr = FindRecord(slotRecord);
- if( osErr == 0 )
- osErr = slotRecord.Delete();
- ASSERTNOERR(osErr);
-
-
-
- CRecordID dirRecord(gKeyChainDSRefnum,"eWorldPMSAM","aoce DirectoryEwrd");
- osErr = FindRecord(dirRecord);
- if( osErr == 0 )
- dirRecord.Delete();
- ASSERTNOERR(osErr);
-
-
- if( osErr != 0 ) {
- MailWakeupPMSAMPB pb;
- memset(&pb,0,sizeof(MailWakeupPMSAMPB));
- pb.pmsamCID.source = msamRecord.fCID.source;
- pb.pmsamCID.seq = msamRecord.fCID.seq;
- pb.mailSlotID = 1; //•• guess??
- osErr = MailWakeupPMSAM((MSAMParam*)&pb);
- }
- #endif
-
-
-
-
- }
-
-
-
- //-------------------------------------------------------------------------------------
- OSErr TApplication::InitAuth(void)
- {
- AuthParamBlock authBlock;
-
- OSErr osErr = AuthGetLocalIdentity(&authBlock,false);
- //••• failures?
-
- gIdentity = authBlock.getLocalIdentityPB.theLocalIdentity;
-
-
- return osErr;
- }
-
-
-
-
- //-------------------------------------------------------------------------------------
- void TApplication::Run()
- {
- EventRecord ev;
- Boolean gotEvt;
- OSErr err;
- long astackspace;
-
- while (!gDone) {
-
-
- gotEvt = false;
- gotEvt = WaitNextEvent(highLevelEventMask,&ev,fWNESleepTime,nil);
-
- if (gotEvt) {
-
- err = this->HandleEvent(&ev);
- if (err == kQuitFileGateResult)
- gDone = true;
-
- } else {
-
- // Time to see if we got any letters put in our inBin
- astackspace= StackSpace();
- ASSERTPRINT(astackspace>1024, ("Stack is low!\n"));
-
- }
-
-
- gDone = true;
-
-
- }
-
-
- }
-
-
-
- //-------------------------------------------------------------------------------------
- OSErr TApplication::HandleEvent(EventRecord *ev)
- {
- OSErr err = noErr;
- char key; // the key returned from a keyDownEvent
-
-
- switch (ev->what) {
- case kHighLevelEvent:
- err = this->DoHighLevelEvent(ev);
- break;
-
-
- // Quit FileGate by pressing Cmd-Option-F
-
- case keyDown:
- key = (char) (ev->message & charCodeMask);
- if( key == 'f' ) {
- if ( ev->modifiers & (cmdKey & optionKey) ) {
- err = kQuitFileGateResult;
- }
- }
- break;
- }
-
- return err;
- }
-
-
-
- //-------------------------------------------------------------------------------------
- OSErr TApplication::HandleCoreEvents(long messageID,Ptr /*buff*/,unsigned long /*msgLen*/)
- {
-
- OSErr err = noErr;
-
- switch (messageID) {
- case kAEOpenApplication:
- break;
- case kAEOpenDocuments:
- break;
- case kAEPrintDocuments:
- break;
- case kAEQuitApplication:
- err = noErr;
- gDone = true;
- break;
- }
- return err;
-
- }
-
-
-
-
- //-------------------------------------------------------------------------------------
- OSErr TApplication::DoHighLevelEvent(EventRecord *ev)
- {
- TargetID sender;
- OSType messageID;
- unsigned long refCon;
- unsigned long msgLen;
- Ptr buff;
- MailEPPCMsg *mailEPPC;
-
- msgLen = 0;
- buff = nil;
-
- OSErr err = AcceptHighLevelEvent(&sender,&refCon,buff,&msgLen);
- if (err==bufferIsSmall) {
- buff = NewPtr(msgLen);
- ASSERTPRINT(buff != NULL, ("Memory error in do highlevelevent"));
- err = AcceptHighLevelEvent(&sender,&refCon,buff,&msgLen);
- }
-
-
- switch (ev->message) {
-
- case kCoreEventClass:
- err = this->HandleCoreEvents(messageID,buff,msgLen);
- default:
- break;
- }
-
- DisposPtr(buff);
- return err;
- }
-